import theano
import theano.tensor as T
import numpy as np


# 定义单步的函数,实现a*x^n
# 输入参数的顺序要与下面scan的输入参数对应
def one_step(coef, power, x):
    return coef * x ** power


coefs = T.ivector()  # 每步变化的值,系数组成的向量
powers = T.ivector()  # 每步变化的值,指数组成的向量
x = T.iscalar()  # 每步不变的值,自变量

# seq,out_info,non_seq与one_step函数的参数顺序一一对应
# 返回的result是每一项的符号表达式组成的list
result, updates = theano.scan(fn=one_step,
                              sequences=[coefs, powers],
                              outputs_info=None,
                              non_sequences=x)

# 每一项的值与输入的函数关系
f_poly = theano.function([x, coefs, powers], result, allow_input_downcast=True)

coef_val = np.array([2, 3, 4, 6, 5])
power_val = np.array([0, 1, 2, 3, 4])
x_val = 10

print("多项式各项的值: ", f_poly(x_val, coef_val, power_val))
# scan返回的result是每一项的值，并没有求和，如果我们只想要多项式的值，可以把f_poly写成这样：
# 多项式每一项的和与输入的函数关系
f_poly = theano.function([x, coefs, powers], result.sum(), allow_input_downcast=True)

print("多项式和的值：", f_poly(x_val, coef_val, power_val))